//获取数组中与目标值最接近的值

//无序数组
//方法一:
//使用reduce计算差值 差值最小的返回

// let arr = [1, 3, 4, 6, 2, 11, 55, 44, 11];
// let target = 15;

// function getApproachNum(arr, target) {
//   //这里不需要用初始值
//   return arr.reduce((pre, cur) => {
//     return Math.abs(pre - target) > Math.abs(cur - target) ? cur : pre;
//   });
// }

// console.log(getApproachNum(arr, 15));

//有序数组
let newArr = [1, 3, 5, 6, 7, 9, 10, 12, 15, 19];
let newArr2 = newArr.reverse();
console.log(newArr2);
//方法二:
/*
二分查找
获取最左left和最右right两个数组索引,取一个中间值center  然后判断数组如何排序
升序:
吧目标值和中间值做比较 如果大于中间值 则说明目标值在数组左边 则改变right序号为center序号
如果小于中间值 则说明目标值在数组右边 则改变left序号为center序号


降序:
与上述原理相反
*/
//升序
// function getApproachNum(arr, target) {
//   let left = 0;
//   let right = arr.length - 1;
//   let center;
//   //当两者等于1则表示最接近target的就是这两个序号的值
//   while (right - left > 1) {
//     center = Math.floor((right + left) / 2);
//     arr[center] - target > 0 ? (right = center) : (left = center);
//   }
//   console.log(center);
//   return Math.abs(arr[right] - target) > Math.abs(arr[left] - target)
//     ? arr[left]
//     : arr[right];
// }
// console.log(getApproachNum(newArr, 8));

//降序
function getApproachNum(arr, target) {
  let left = 0;
  let right = arr.length - 1;
  let center;
  //当两者等于1则表示最接近target的就是这两个序号的值
  while (right - left > 1) {
    center = Math.floor((right + left) / 2);
    arr[center] - target > 0 ? (left = center) : (right = center);
  }
  return Math.abs(arr[right] - target) > Math.abs(arr[left] - target)
    ? arr[right]
    : arr[left];
}
console.log(getApproachNum(newArr, 8));
